package zx.lrn.notes.basic_data_type;

/**
 * 位运算、位移运算的demo和笔记
 */
public class BitOperation {
    public static void main(String[] args) {
        /* a.位运算部分 */
        int a = 0b1010; // 10
        int b = 0b0011; // 3
        // 1、按位与，参与运算的二级制位都为1时得1，否则为0
        printBinary(a & b); // 0010
        // 2、按位或，参与运算的二级制位都为0时得0，否则为0
        printBinary(a | b); // 1011
        // 3、按位异或，参与运算的二级制位不相同得1，否则为0
        printBinary(a ^ b);// 1001
        // 4、按位取反，顾名思义
        printBinary(~a);

        /* b.位移运算部分 */
        int n = 0b01000000000000000000000000000001;
        // 1、左移，所有的二进制位向左移动，溢出截掉，右边补0；如果位移的结果最高位是1，代表结果为负，且此二进制数为负数对应的补码;
        // 在不产生高位1被截掉或最高位变为1，左移几位即乘几次2
        printBinary(n << 1); // 10000000000000000000000000000010
        printBinary(n << 2); // 得4

        // 2、右移，所有二级制位向右移动，溢出截掉，正数右补0，负数右补1;
        // 正数右移几位，相当于做除（2的几次方)再向下取整
        printBinary(15 >> 1); // 得7
        printBinary(15 >> 2); // 得3

        // 3、无符号右移，所有二级制位向右移动，溢出截掉，无论正负都右补0;
        printBinary(n >>> 2); //00010000000000000000000000000000
    }

    private static void printBinary(int i) {
        System.out.println(Integer.toBinaryString(i));
    }
}
